# 作者： 李泉志
# 2025年01月08日18时57分秒
# 2947029073@qq.com

"""
7 继承
面向对象三大特性
1 封装:根据职责将属性和方法封装到一个抽象的类中
2 继承:实现代码的重用，相同的代码不需要重复的编写
3 多态:不同的对象调用相同的方法，产生不同的执行结果，增加代码的灵活度

01. 单继承
1.1 继承的概念、语法和特点
继承的概念：子类拥有父类的所有方法和属性
1) 继承的语法
class 类名(父类名):
    pass
• 子类继承自父类，可以直接享受父类中已经封装好的方法，不需要再次开发
• 子类中应该根据职责，封装子类特有的属性和方法
2) 专业术语
• Dog 类是Animal类的子类，Animal类是Dog类的父类，Dog类从Animal类继承
• Dog 类是Animal类的派生类，Animal类是Dog类的基类，Dog类从Animal类派生
3) 继承的传递性
• C 类从B类继承，B类又从A类继承
• 那么C类就具有B类和A类的所有属性和方法
• 子类拥有父类以及父类的父类中封装的所有属性和方法

1.2 方法的重写
• 子类继承自父类，可以直接享受父类中已经封装好的方法，不需要再次开发
• 当父类的方法实现不能满足子类需求时，可以对方法进行重写(override)

重写父类方法有两种情况：
1.覆盖父类的方法
2.对父类方法进行扩展

1) 覆盖父类的方法
• 如果在开发中，父类的方法实现和子类的方法实现，完全不同
• 就可以使用覆盖的方式，在子类中重新编写父类的方法实现
具体的实现方式，就相当于在子类中定义了一个和父类同名的方法并且实现重写之后，
在运行时，只会调用子类中重写的方法，而不再会调用父类封装的方法

2) 对父类方法进行扩展
• 如果在开发中，子类的方法实现中包含父类的方法实现就可以使用扩展的方式
    – 父类原本封装的方法实现是子类方法的一部分
1) 在子类中重写父类的方法
2) 在需要的位置使用 super().父类 方法来调用父类方法的执行
3) 代码其他的位置针对子类的需求，编写子类特有的代码实现
关于 super
• 在Python中 super是一个特殊的类
• super()就是使用super类创建出来的对象
• 最常使用的场景就是在重写父类方法时，调用在父类中封装的方法实现

提示
• 在开发时，父类名 和 super() 两种方式不要混用
• 如果使用当前子类名调用方法，会形成递归调用，出现死循环

1.3 父类的私有属性和私有方法
1)子类对象不能在自己的方法内部，直接访问父类的私有属性或私有方法
2)子类对象可以通过父类的公有方法间接访问到私有属性或私有方法（父类在自己的公有方法中调用私有方法）
• 私有属性、方法是对象的隐私，不对外公开，外界以及子类都不能直接访问
• 私有属性、方法通常用于做一些内部的事情
"""


class Animal:
    def __init__(self,name):
        self.name = name

    def eat(self):
        print("吃---")

    def drink(self):
        print("喝---")

    def run(self):
        print("跑---")

    def sleep(self):
        print("睡---")


class Dog(Animal):  # 支持多重继承
    def __init__(self, name,color):
        super().__init__(name)
        self.color = color

    def bark(self):
        print(f'{self.color} {self.name}在叫')

    def run(self):
        super().run()
        print(f'{self.name}在跑')

class xiaotian(Dog):
    def __init__(self, name,color,age):
        super().__init__(name,color)
        self.age = age
    def fly(self):
        print(f'{self.age}的{self.color} {self.name}在飞')


if __name__ == '__main__':
    dog = Dog('wangcai','yellow')
    dog.run()
    dog.bark()
    xt = xiaotian('xiaotian','white',20)
    xt.fly()
